環境マネージメントゲーム(SARA版)
はじめに
本プログラムは、京都大学経済学部の出口弘氏による、「環境マネージメントゲームVer.0.98」をもとに、そのゲーミングをマルチエージェント記述言語「SARA」で記述したものである。出口氏によるオリジナルのドキュメントは、こちらを参照されたい。
本ドキュメントはオペレータのために書かれたものである。各プレーヤには、こちらのドキュメントを配布されたい。
SARAによって実装されたことにより、本プログラムによるゲーミングは以下の特徴を持っている。
- 計算を自動化することにより、オペレータとプレーヤの負担を軽減し、また計算ミスをなくすことができる
- 上記によって、ゲームに要する時間を短縮し、より手軽に密度の濃いゲームを実現する
- ネットワーク上で実施できるため、地理的に離れた場所でもゲームに参加でき、また多人数でプレーすることも容易である
- ゲームルールの変更・拡張が容易であり、税金などの制度を動的に導入できる。
- 本バージョンでは実装されていないが、プレーヤに自律エージェントを含めることも可能である。
ゲームの目的
本プログラムは、出口氏のいうところの
環境マネージメントゲームは、一定の閉ざされた環境のもとでの羊の放牧によって生計をたてる仮想の集団のグループゲーミングシミュレーションである。プレーヤはMOU(マネーユニット:マウと読む)という単位の現金で羊や食料などの取引をゲームファシリテータと行ったり、羊を借りることができる。プレーヤは自らの豊かな生活を目指してこれらの取引を通じてゲームを行う。各期の終わりに手持ちの羊にその期の共有地の羊の総量に依存した増殖倍率をかけた羊が今期の期末の増殖分を含む羊数として与えられる。個々のプレーヤは羊を増やすことでその生活は豊かになるが、共有地全体で羊を増やし過ぎると羊の増殖率が低下するという社会的ジレンマ状況が成立する。
を踏襲し、オリジナルのゲームをコンピュータ上で忠実に再現するべく作成された。しかし、オリジナルのゲームとコンピュータプログラム上でのそれとは、媒体の性質上、いくつかの点で異なる性質を持つ可能性があるが、その点については後述する。
実行方法
ここでの説明は、既にSARAの実行環境が整えられていることを前提に進める。すなわち、SARAシステムとそのライブラリが適切にインストールされ、サーバーの public_html ディレクトリからSARAのトップディレクトリ( sara )にシンボリックリンクが張られ、環境変数 SARA_HOME に 同ディレクトリへのパスが設定されている状態である。
- カレントディレクトリを commons.spd のあるディレクトリに移し、そこで
を実行すると、サーバープログラム(SARAインタープリタ)が起動し、そして commons.spd というファイルが読み込まれて実行が開始される。
- 画面上の指示に従って、SARAインタープリタ上で
を入力してプレーヤの人数を指定する。ただし、この時 n はプレーヤの人数を数字で置き換えて入力する必要がある。例えば、5人でプレーする場合は
を入力すればよい。
- 上記の操作によって、commons.spd があるディレクトリからの相対パスが
のディレクトリに、プレーヤーの人数分のHTMLファイルが作られるので、各プレーヤが自分の担当のものを読み込んで、プレイヤーインターフェースのプログラムを実行する。すなわち、プレーヤが各々の端末において、appletviewer や WWWブラウザなどの、JAVAアプレットを実行できるソフトでファイルを読み込むのである。例えばプレーヤ1(太郎)を担当するプレーヤは、サーバープログラムを起動しているサーバー上にある先程作られたHTMLファイルを、以下の様にURLで指定して表示してやればよい。
http://URLofServer/~YourHome/sara/samples/commons/html/players/player1.html
なお、アプレットが適切に立ち上がったかどうかをオペレータが把握するには、SARAインタープリタ上で、
と入力すればよい。これは、サーバーに繋がったアプレットの一覧を表示するコマンドである。
- 全てのプレーヤがアプレットを立ち上げた後に、SARAインタープリタ上で
を入力すると、ゲームが開始される。各プレーヤのインターフェースには、ゲームが開始された旨のメッセージが表示され、以後はプレーヤの行動によってゲームは進行していく。
- ゲームを終了するには、SARAインタープリタ上で、
と入力する。すると、その次のタームを最終タームに設定して、最終タームの終了とともに勝利者を表示してゲームは終了する。
ゲームの進行
ゲームはターム制で進行する。タームが開始されると、各プレーヤには以下の7つのアクションが選択可能になり、任意のアクションを任意の回数だけ実行することができる。そのタームに行いたいアクションが一通り終わったプレーヤは、「行動完了」というアクションを選択する。全てのプレーヤが行動完了した時点で、終了処理を行って、次のタームが開始される。ゲームはこのプロセスを繰り返すことで進行し、オペレータが設定した最終タームの終了とともに終了する。
各プレーヤは、タームごとに繁殖する羊をやりくりしながら経済活動を行い、それによって得られた資金で生活の為の「食料」や、豊かさを表す「宝石」を購入していく。なお、食料はタームごとに1袋消費されるので、底をつかせてはならない。
- 羊を買う
1匹の羊に対して、2MOUを払うことによって、飼っている羊の数を増やす。
- 羊を売る
1匹の羊に対して、2MOUの値段で売って、資金を増やす。ただし、1タームにつき、最大7匹までしか売ることはできない。
- 羊を借りる
羊を借りることによって、飼っている羊の数を増やす。借りた羊は、次の次のタームに2倍返しで返済する。ただし、借りることのできる羊は1タームつき最大7匹までである、かつ返済期限の羊がいる状態で羊を借りることはできない。
- 羊を返済する
前の前のタームに借りた羊を2倍返しで返却する。羊を返却する方法はこの方法のみで、直前のタームに借りた羊を返却することはできない。
- 食料を買う
食料1袋に対して、2MOUを払って購入する。
- 宝石を買う
宝石1個に対して、5MOUを払って購入する。
- 行動完了
そのタームでの行動を終了する時や、そのタームの行動をやり直したい時に選択する。そのタームでプレーヤがとった行動が表示されるので、それを見て、「行動完了」か「やり直し」を選択することができる。前者を選んだ場合は、次のタームまで待機することになり、後者を選んだ場合は、そのタームの初期状態に戻るので、新たにアクションをやりなおすことができる。ただし、食料を1袋も持っていない場合や、返済期限の羊が残っている場合は、「行動完了」を選ぶことはできない。
各タームが終了した時点で、各プレーヤの「飼っている羊」の合計が計算され、それに基づいて、環境(共用地)の持つ「羊の繁殖倍率」が算出される。そして、各プレーヤの羊はその倍率を掛けた匹数に増やされる。ただし、小数部はまるめられる。
返済期限の羊を返すことができなくなったプレーヤには、タームの開始時にそれを判定されて、破産処理がなされる。破産したプレーヤは初期状態に戻り、そのままゲームを続行することになる。
最終タームはオペレータが設定し、「羊を借りる」のアクションは禁止される。勝利者の判定については、ゲーム終了時に保持している羊の数(返済期限の羊があればそれを差し引いて数える)と食料や宝石を資金に換算し、それが最も大きいプレーヤを勝利者とする。
参照できるリソース
プレーヤが意志決定をする際に参照することができるリソースには以下のものがある。各々のプレーヤは、インターフェースでタブを選択することによって他の全てのプレーヤの(そのターム開始時点での)リソースを見ることができる。
- 各プレーヤに属するもの
飼っている羊 | 3匹(初期値) |
資金 | 0MOU(初期値) |
返済期限の羊 | 0匹(初期値) |
前のタームに借りた羊 | 0匹(初期値) |
食料 | 0袋(初期値) |
宝石 | 0個(初期値) |
破産回数 | 0回(初期値) |
- 環境に属するもの
ターム | 0(初期値) |
羊の価格 | 2MOU |
羊の返済利率 | 2倍 |
羊の増殖倍率 | 1.0〜2.0倍の間で変動 |
羊の借り入れ限界 | 7匹 |
羊の売却限界 | 7匹 |
羊飼いの数 | プレーヤの人数 |
羊の返済利率 | 2倍 |
食料の価格 | 2MOU |
宝石の価格 | 5MOU |
繁殖倍率の算出、破産判定、勝利判定のアルゴリズム
「羊の繁殖倍率」は、各タームの終了時に算出される。繁殖倍率は、環境における羊の合計、すなわち全てのプレーヤの「飼っている羊」の合計と、プレーヤの数、すなわち「羊飼いの人数」に依存するが、そのアルゴリズムは以下である。なお、このアルゴリズムはプレーヤには秘密にしておくことが望ましい。
| | 羊の合計 | ≦ | 羊飼いの人数×1×3 | ・・・2.0倍 |
羊飼いの人数×1×3 | < | 羊の合計 | ≦ | 羊飼いの人数×2×3 | ・・・1.8倍 |
羊飼いの人数×2×3 | < | 羊の合計 | ≦ | 羊飼いの人数×3×3 | ・・・1.6倍 |
羊飼いの人数×3×3 | < | 羊の合計 | ≦ | 羊飼いの人数×4×3 | ・・・1.4倍 |
羊飼いの人数×4×3 | < | 羊の合計 | ≦ | 羊飼いの人数×5×3 | ・・・1.2倍 |
羊飼いの人数×5×3 | < | 羊の合計 | | | ・・・1.0倍 |
プレーヤの破産判定は各タームの開始時になされるが、そのアルゴリズムは以下である。すなわち、そのタームにどのような行動をとっても、「行動完了」の基準を満たすことができないとみなされる場合に、破産が宣告されるのである。ただし、最終タームは羊の借り入れができないので、食料を持っていない場合は右辺から食料の価格を引くことになる。
- 資金 + 羊の価格×(飼っている羊の数+返済期限の羊の数) < 0 の場合は破産
ゲーム終了時には、その時点での総資産が最も多いプレーヤを全プレーヤに通知する。総資産の算出は以下の手順をとる。すなわち、最終タームの直前のタームで借りた羊については、返済利率を掛けた匹数を返済させ、残った羊や食料などの財を資金に換算したものを総資産とする。
- 資金 + 羊の価格×(飼っている羊の数+返済期限の羊の数) + 食料の価格×食料の数 + 宝石の価格×宝石の数
オペレータのための、その他の機能
ゲームを開始、終了する為の操作の他にも、オペレータがゲームの展開を把握したり、プレーヤと通信するための機能がいくつか用意されている。それらはSARAインタープリタ上で以下のコマンドを入力することによって使うことができる(実際はインタープリタのコマンドではなく、クロージャを呼び出している)。
- help();
オペレータによる操作方法の一覧が表示される
- watch();
その時点でのプレーヤインターフェースの内容(その前のタームでのリソース)の一覧を表示する
- announce(text);
全てのプレーヤにメッセージを送る。ただし、text は、送りたいメッセージを二重引用符で括られた文字列にしたもので置き換えて入力する必要がある。例えば、「お元気ですか」というメッセージを送りたい場合は、
と入力すればよい。すると、各プレーヤのインターフェースに、そのメッセージが表示される。
- wisper(n, text);
指定したプレーヤにメッセージを送る。ただし、n はプレーヤの番号(「プレーヤ1=太郎」なら 1、「プレーヤ2=次郎」なら 2、...)に置き換え、text は announce と同様に、メッセージを文字列にしたものを使う必要がある。例えば、プレーヤ3(=三郎)に「頑張れ」と送りたい場合は、
と入力すればよい。すると、プレーヤ3にのみ、そのメッセージが通知される。
- investigate(text);
全てのプレーヤに質問のメッセージを出し、その回答を回収する。text の使い方は announce と同様に、質問のメッセージを置き換えて入力する。
- inquire(n, text);
指定したプレーヤに質問のメッセージを出し、その回答を回収する。n と text の使い方は wisper と同様に、プレーヤの指定とメッセージを置き換えて入力する。
- listen();
investigate や inquire で集めた回答を画面に表示する。
- communication(n);
全てのプレーヤの、「発言する」のアクションの使用許可を変更する。許可する場合は n を 1 に置き換え、不許可にする場合は 0 に置き換えて入力する。なお、初期値では不許可になっている。
- history();
各プレーヤの「発言する」の内容の履歴を画面に表示する。
制度の導入
ゲームのバリエーションとして、税金と補助金の制度をとることができる。実際には税は金ではなく羊を徴収し、また補助金も羊で交付される。税は以下のアルゴリズムで算出され、タームの行動を完了した時に徴収される。すなわち、飼っている7匹以上の羊に対して税率を掛けた頭数を徴収する。ただし、端数はまるめられる。
税率の決定には単純課税方式と累進課税方式があり、前者は一律10%であるが、後者は以下のアルゴリズムに基づく。
| | 飼っている羊 | ≦ | 6 | ・・・0% |
6 | < | 飼っている羊 | ≦ | 10 | ・・・10% |
10 | < | 飼っている羊 | ≦ | 15 | ・・・20% |
15 | < | 飼っている羊 | | | ・・・30% |
補助羊制度は、税として徴収した羊を、飼っている羊が5匹以下のプレーヤに頭割りで分配する制度である。ただし、該当するプレーヤがいない場合や頭割りに不足する場合はその羊の分配は次のタームに持ち越され、また頭割りして余った羊も同様に持ち越される。
上記の各制度はゲーム中にオペレータによって導入あるいは廃止される。それには以下のコマンドを用いる。ただし、導入・廃止が反映されるのはコマンドを入力した次のタームからである(ゲームの最初から導入したい場合は、go(); を入力する前に導入すればよい)。
- introduce(n);
制度を導入する。n が 1 なら単純課税制度、2 なら累進課税制度、3 なら補助金制度を導入する。例えば、単純課税制度に加えて補助金制度を導入する場合は、
introduce(1); と introduce(3);
を入力すればよい。
- abolish(n);
制度を廃止する。n が 1 なら単純課税制度、2 なら累進課税制度、3 なら補助金制度を廃止する。
オリジナルとの比較
プレーヤの豊かさを示す「財」の種類が、オリジナルでは車や家など多様に用意されているのに対し、本プログラムでは「宝石」のみしか用意していない。これは、現時点でのSARAのプレーヤインターフェースでは、財の存在をプロパティの数字が変化することでしか表現できないことによる。すなわち、財の存在が注目されにくくなることを抑止するために、その種類を1つに絞ったものである。
本ゲームにおいては、プレーヤが意志決定をする際には、環境や他のプレーヤの状態を参考にすることになり、したがって、プレーヤがいかなる情報を得ることができるかはゲームの性質を左右する重要な要素である。オリジナルではゲームマスターが実施環境を任意に設定することができ、あるいは曖昧にしておくことも可能であるが、本プログラムでは媒体の性質上、参照できる情報とそうでないものの区別を明確にしなければならない。ところで、既に述べたように、プレーヤは前ターム終了時における各プレーヤの個別の情報を全て参照できるようにしてある。これはオリジナルの目的にできるだけ沿う形で設定したつもりであるが、コードに少々手を加えることによって、任意に変更することも可能である。
上記と同様の理由により、プレーヤ同士のコミュニケーションの可・不可も厳密に設定する必要がある。オリジナルではプレーヤ同士が会話をすることによってコミュニケーションをとることができるが、本プログラムでは、ネットワークを使っての実施を鑑みて、オペレータの裁量で「発言する」というアクションを使用できるようにした。これによって、プレーヤは任意の相手に任意の情報を伝えることができるようになる。この機能はデブリーフィングにも活用されたい。